# Nodo del trie: contiene 
# * la chiave @SuffixNodeKey 
# * un array di figli
# * il riferimento al padre
class SuffixNode
	attr_accessor :chiave, :figli, :padre
	
	def initialize(chiave = nil, figli = nil, padre = nil)
		if(!chiave.nil?)
			@chiave = chiave
		else 
			@chiave = SuffixNodeKey.new
		end
		
		@figli = nil
		
		if(figli.nil? or (figli.respond_to?(:[]) \
				and figli.respond_to?(:each) \
				and figli.respond_to?(:size)))
		 @figli = figli
		else
			raise InvalidArgument.new("figli don't respond to [], each and size") 
		end
		
		if(padre.nil? or padre.is_a?(SuffixNode)) 
			@padre = padre
		end
	end
	
	public
	def is_root?
		@chiave.lunghezza == 0
	end
	
	public
	def is_leaf?
		figli.nil? or figli.empty?
	end
end

# Classe contenente le iformazioni relative alla parte di stringa cui il nodo
# si riferisce
class SuffixNodeKey
	attr_accessor :indice, :inizio, :lunghezza
	
	def initialize(idx = 0, istart = 0, l = 0)
		@indice = @inizio = @lunghezza = 0
		if(idx.respond_to?(:to_i)) 
			@indice = idx.to_i
		end
		if(istart.respond_to?(:to_i)) 
			@inizio = istart.to_i
		end
		if(l.respond_to?(:to_i)) 
			@lunghezza = l.to_i
		end
	end
end
